<!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>MongoDB简述(略)</title>
        <style>
</style>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.2/dist/katex.min.css" integrity="sha384-yFRtMMDnQtDRO8rLpMIKrtPCD5jdktao2TV19YiZYWMDkUR5GQZR/NOVTdquEx1j" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.css" rel="stylesheet" type="text/css">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/highlight.css">
<style>
            body {
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif;
                font-size: 14px;
                line-height: 1.6;
            }
        </style>
        <style>
.task-list-item { list-style-type: none; } .task-list-item-checkbox { margin-left: -20px; vertical-align: middle; }
</style>
        
        <script src="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.js"></script>
        
    </head>
    <body class="vscode-light">
        <h1 id="mongodb简述略">MongoDB简述(略)</h1>
<p>官网： <a href="https://www.mongodb.com/">https://www.mongodb.com/</a></p>
<h1 id="mongodb-安装略">MongoDB 安装（略）</h1>
<p><a href="https://www.mongodb.com/try/download/community">https://www.mongodb.com/try/download/community</a></p>
<p>选择对应的版本安装</p>
<h1 id="设置密码初学跳过">设置密码（初学跳过）</h1>
<h2 id="创建管理员账户">创建管理员账户</h2>
<pre><code class="language-shell"><div>use admin

db.createUser(
  {
    user: "admin",
    pwd: "admin",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
</div></code></pre>
<p>管理员创建成功，现在拥有了用户管理员
用户名：adminUser
密码：adminPass
然后，断开 mongodb 连接， 关闭数据库</p>
<h2 id="创建普通用户">创建普通用户</h2>
<p>过程类似创建管理员账户，只是 role 有所不同</p>
<pre><code class="language-css"><div><span class="hljs-selector-tag">use</span> <span class="hljs-selector-tag">foo</span>

<span class="hljs-selector-tag">db</span><span class="hljs-selector-class">.createUser</span>(
  {
    <span class="hljs-attribute">user</span>: <span class="hljs-string">"simpleUser"</span>,
    pwd: <span class="hljs-string">"simplePass"</span>,
    roles: [ { role: <span class="hljs-string">"readWrite"</span>, db: <span class="hljs-string">"foo"</span> },
             { <span class="hljs-attribute">role</span>: <span class="hljs-string">"read"</span>, db: <span class="hljs-string">"bar"</span> } ]
  }
)
</div></code></pre>
<p>现在我们有了一个普通用户
用户名：simpleUser
密码：simplePass
权限：读写数据库 foo， 只读数据库 bar。</p>
<p><strong>注意</strong>
<code>use foo</code>表示用户在 foo 库中创建，就一定要 foo 库验证身份，即用户的信息跟随随数据库。比如上述 simpleUser 虽然有 bar 库的读取权限，但是一定要先在 foo 库进行身份验证，直接访问会提示验证失败。</p>
<pre><code class="language-bash"><div>mongo -u <span class="hljs-string">"用户名"</span> -p<span class="hljs-string">'密码'</span>
</div></code></pre>
<pre><code class="language-rust"><div><span class="hljs-keyword">use</span> foo
db.auth(<span class="hljs-string">"simpleUser"</span>, <span class="hljs-string">"simplePass"</span>)

<span class="hljs-keyword">use</span> bar
show collections
</div></code></pre>
<h3 id="24-内建角色">2.4 内建角色</h3>
<ul>
<li>Read：允许用户读取指定数据库</li>
<li>readWrite：允许用户读写指定数据库</li>
<li>dbAdmin：允许用户在指定数据库中执行管理函数，如索引创建、删除，查看统计或访问system.profile</li>
<li>userAdmin：允许用户向system.users集合写入，可以找指定数据库里创建、删除和管理用户</li>
<li>clusterAdmin：只在admin数据库中可用，赋予用户所有分片和复制集相关函数的管理权限。</li>
<li>readAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的读权限</li>
<li>readWriteAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的读写权限</li>
<li>userAdminAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的userAdmin权限</li>
<li>dbAdminAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的dbAdmin权限。</li>
<li>root：只在admin数据库中可用。超级账号，超级权限</li>
</ul>
<p>配置文件：</p>
<pre><code class="language-yml"><div><span class="hljs-attr">security:</span>
	<span class="hljs-attr">authorization:</span> <span class="hljs-string">enabled</span> <span class="hljs-comment">#注意缩进，缩进参照配置文件其他配置。缩进错误可能第6步重启不成功。</span>
</div></code></pre>
<p>或者使用 --auth参数</p>
<h1 id="mongodb使用">MongoDB使用</h1>
<pre><code class="language-bash"><div><span class="hljs-comment"># 启动mongoDB服务： 在mongoDB安装bin目录下执行mongodb</span>
mongod --dbpath c:\data\db <span class="hljs-comment"># --dbpath 指定数据库的路径</span>
--port 27017 <span class="hljs-comment"># 指定端口</span>
</div></code></pre>
<pre><code class="language-yaml"><div><span class="hljs-comment"># 创建配置文件</span>
<span class="hljs-attr">systemLog:</span>
<span class="hljs-attr">    destination:</span> <span class="hljs-string">file</span>
<span class="hljs-attr">    path:</span> <span class="hljs-attr">c:\data\log\mongod.log</span>
<span class="hljs-attr">storage:</span>
<span class="hljs-attr">    dbPath:</span> <span class="hljs-attr">c:\data\db</span>
</div></code></pre>
<pre><code class="language-bash"><div><span class="hljs-comment"># 运行服务， 管理员权限操作</span>
mongod --config <span class="hljs-string">"配置文件路径"</span> --install <span class="hljs-comment"># --install 用于安装服务</span>
<span class="hljs-comment"># 如果需要，您可以安装 mongod.exe 或 mongos.exe 的多个实例的服务。只需要通过使用 --serviceName 和 --serviceDisplayName 指定不同的实例名。只有当存在足够的系统资源和系统的设计需要这么做。</span>

<span class="hljs-comment"># window 启动MongoDB服务， 服务启动命令 net start 服务名</span>
net start MongoDB(默认值)
net stop MongoDB
<span class="hljs-comment"># 移除服务</span>
mongod --remove
</div></code></pre>
<table>
<thead>
<tr>
<th style="text-align:left">SQL术语/概念</th>
<th style="text-align:left">MongoDB术语/概念</th>
<th style="text-align:left">解释/说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">database</td>
<td style="text-align:left">database</td>
<td style="text-align:left">数据库</td>
</tr>
<tr>
<td style="text-align:left">table</td>
<td style="text-align:left">collection</td>
<td style="text-align:left">数据库表/集合</td>
</tr>
<tr>
<td style="text-align:left">row</td>
<td style="text-align:left">document</td>
<td style="text-align:left">数据记录行/文档</td>
</tr>
<tr>
<td style="text-align:left">column</td>
<td style="text-align:left">field</td>
<td style="text-align:left">数据字段/域</td>
</tr>
<tr>
<td style="text-align:left">index</td>
<td style="text-align:left">index</td>
<td style="text-align:left">索引</td>
</tr>
<tr>
<td style="text-align:left">table joins</td>
<td style="text-align:left"></td>
<td style="text-align:left">表连接,MongoDB不支持</td>
</tr>
<tr>
<td style="text-align:left">primary key</td>
<td style="text-align:left">primary key</td>
<td style="text-align:left">主键,MongoDB自动将_id字段设置为主键</td>
</tr>
</tbody>
</table>
<p>通过下图实例，我们也可以更直观的了解Mongo中的一些概念：</p>
<p><img src="" alt="img"></p>
<pre><code class="language-bash"><div><span class="hljs-comment"># 启动shell，是一个javscript shell</span>
mongo
&gt; show dbs <span class="hljs-comment"># 查询数据库， 只会看见有数据的数据库</span>
&gt; db <span class="hljs-comment"># 显示当前数据库对象或集合，默认当前数据库，test</span>
&gt; use <span class="hljs-built_in">local</span> <span class="hljs-comment"># 连接到一个指定的数据库， 如果不存在就创建数据库， 集合只有插入后创建</span>
</div></code></pre>
<p>标准url连接</p>
<pre><code class="language-bash"><div>mongodb://[username:password@]host1[:port1][,host2[:port2], ... hostN[:portN]][/[database][?options]]
</div></code></pre>
<pre><code class="language-bash"><div>mongo
<span class="hljs-comment"># 然后键入</span>
&gt; mongodb://[username:password@]host1[:port1][,host2[:port2], ... hostN[:portN]][/[database][?options]]
</div></code></pre>
<h2 id="创建数据库">创建数据库</h2>
<pre><code class="language-bash"><div><span class="hljs-comment"># mongoDB 默认数据库是test， 如果没有创建新的数据库集合将存放在test中</span>
use mydb
db.mydb.insert({<span class="hljs-string">"key"</span>: <span class="hljs-string">"value"</span>}) <span class="hljs-comment"># 向mydb插入数据，创建了mydb数据库就有mydb集合</span>
</div></code></pre>
<h2 id="删除数据库">删除数据库</h2>
<pre><code class="language-bash"><div>use mydb
&gt; db.dropDatabase() <span class="hljs-comment"># 删除数据库</span>
<span class="hljs-comment"># 集合删除 -- 传统的表</span>
&gt; db.createCollection(<span class="hljs-string">"集合名"</span>)
&gt; db.collection.drop()
</div></code></pre>
<h2 id="创建集合">创建集合</h2>
<pre><code class="language-bash"><div>db.createCollection(name, options) <span class="hljs-comment"># name: 集合名, options 参数如下</span>
</div></code></pre>
<table>
<thead>
<tr>
<th style="text-align:left">字段</th>
<th style="text-align:left">类型</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">capped</td>
<td style="text-align:left">布尔</td>
<td style="text-align:left">（可选）如果为 true，则创建固定集合。固定集合是指有着固定大小的集合，当达到最大值时，它会自动覆盖最早的文档。 <strong>当该值为 true 时，必须指定 size 参数。</strong></td>
</tr>
<tr>
<td style="text-align:left">autoIndexId</td>
<td style="text-align:left">布尔</td>
<td style="text-align:left">3.2 之后不再支持该参数。（可选）如为 true，自动在 _id 字段创建索引。默认为 false。</td>
</tr>
<tr>
<td style="text-align:left">size</td>
<td style="text-align:left">数值</td>
<td style="text-align:left">（可选）为固定集合指定一个最大值，即字节数。 <strong>如果 capped 为 true，也需要指定该字段。</strong></td>
</tr>
<tr>
<td style="text-align:left">max</td>
<td style="text-align:left">数值</td>
<td style="text-align:left">（可选）指定固定集合中包含文档的最大数量。</td>
</tr>
</tbody>
</table>
<p>在插入文档时，MongoDB 首先检查固定集合的 size 字段，然后检查 max 字段。</p>
<pre><code class="language-bash"><div><span class="hljs-comment"># 查看对应的集合</span>
show collections
show tables
</div></code></pre>
<h2 id="删除集合">删除集合</h2>
<pre><code class="language-bash"><div>db.collection.drop() <span class="hljs-comment">#删除对应的集合</span>
</div></code></pre>
<h2 id="插入文档">插入文档</h2>
<pre><code class="language-bash"><div>db.COLLECTION_NAME.insert(document) <span class="hljs-comment"># 存在_id则更新数据，不存在插入,如果主键存在，抛出org.springframework.dao.DuplicateKeyException异常,提示主键重复</span>
db.COLLECTION_NAME.save(document) <span class="hljs-comment"># 存在_id则更新数据，不存在插入，新版本废弃</span>
db.collection.replaceOne(查询条件 document, 新的document) <span class="hljs-comment"># 替换， 新的替换原来的</span>
</div></code></pre>
<p><strong>3.2 之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。</strong></p>
<pre><code class="language-bash"><div>db.collection.insertOne(
   &lt;document&gt;,
   {
      writeConcern: &lt;document&gt;
   }
)


db.collection.insertMany(
   [ &lt;document 1&gt; , &lt;document 2&gt;, ... ],
   {
      writeConcern: &lt;document&gt;,
      ordered: &lt;boolean&gt;
   }
)
</div></code></pre>
<p>参数说明：</p>
<ul>
<li><document>：要写入的文档。</li>
<li>writeConcern：写入策略，默认为 1，即要求确认写操作，0 是不要求。</li>
<li>ordered：指定是否按顺序写入，默认 true，按顺序写入。</li>
</ul>
<h3 id="可以将数据定义为变量">可以将数据定义为变量</h3>
<pre><code class="language-js"><div><span class="hljs-built_in">document</span> = ({
	<span class="hljs-attr">key</span>: <span class="hljs-string">"value"</span>
})
db.mydb.insert(<span class="hljs-built_in">document</span>)

</div></code></pre>
<h2 id="更新文档">更新文档</h2>
<pre><code class="language-bash"><div>db.collection.update(&lt;query&gt;, &lt;update&gt;,{
	upsert: &lt;boolean&gt;,
	multi: &lt;boolean&gt;,
	writeConcern: &lt;document&gt;
})
</div></code></pre>
<ul>
<li><strong>query</strong> : update的查询条件，<strong>类似sql update查询内where后面的</strong>。</li>
<li><strong>update</strong> : update的对象和一些更新的操作符（如<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo separator="true">,</mo></mrow><annotation encoding="application/x-tex">,</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3em;vertical-align:-0.19444em;"></span><span class="mpunct">,</span></span></span></span>inc...）等，也可以理解为sql update查询内set后面的</li>
<li><strong>upsert</strong> : 可选，这个参数的意思是，如果不存在update的记录，是否插入objNew,true为插入，默认是false，不插入。</li>
<li><strong>multi</strong> : 可选，mongodb 默认是false,只更新找到的第一条记录，如果这个参数为true,就把按条件查出来多条记录全部更新。</li>
<li><strong>writeConcern</strong> :可选，抛出异常的级别。</li>
</ul>
<h3 id="扩展-操作符查文档">扩展： 操作符（查文档）</h3>
<h2 id="删除文档">删除文档</h2>
<p>remove() 方法的基本语法格式如下所示：</p>
<pre><code class="language-bash"><div>db.collection.remove(
   &lt;query&gt;,
   &lt;justOne&gt;
)
</div></code></pre>
<p>如果你的 MongoDB 是 2.6 版本以后的，语法格式如下：</p>
<pre><code class="language-bash"><div>db.collection.remove(
   &lt;query&gt;,
   {
     justOne: &lt;boolean&gt;,
     writeConcern: &lt;document&gt;
   }
)
</div></code></pre>
<p><strong>参数说明：</strong></p>
<ul>
<li><strong>query</strong> :（可选）删除的文档的条件。</li>
<li><strong>justOne</strong> : （可选）如果设为 true 或 1，则只删除一个文档，如果不设置该参数，或使用默认值 false，则删除所有匹配条件的文档。</li>
<li><strong>writeConcern</strong> :（可选）抛出异常的级别。</li>
</ul>
<h2 id="查询文档">查询文档</h2>
<p>MongoDB 查询数据的语法格式如下：</p>
<pre><code><code><div>db.collection.find(query, projection)
</div></code></code></pre>
<ul>
<li>
<p><strong>query</strong> ：可选，使用查询操作符指定查询条件</p>
</li>
<li>
<p><strong>projection</strong> ：可选，使用投影操作符指定返回的键。查询时返回文档中所有键值， 只需省略该参数即可（默认省略）。</p>
</li>
<li>
<p>如果你需要以易读的方式来读取数据，可以使用 pretty() 方法，语法格式如下：</p>
<pre><code><code><div>db.col.find().pretty()
</div></code></code></pre>
<p>pretty() 方法以格式化的方式来显示所有文档。</p>
<h2 id="mongodb-与-rdbms-where-语句比较">MongoDB 与 RDBMS Where 语句比较</h2>
<p>如果你熟悉常规的 SQL 数据，通过下表可以更好的理解 MongoDB 的条件语句查询：</p>
<table>
<thead>
<tr>
<th style="text-align:left">操作</th>
<th style="text-align:left">格式</th>
<th style="text-align:left">范例</th>
<th style="text-align:left">RDBMS中的类似语句</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">等于</td>
<td style="text-align:left"><code>{&lt;key&gt;:&lt;value&gt;</code>}</td>
<td style="text-align:left"><code>db.col.find({&quot;by&quot;:&quot;菜鸟教程&quot;}).pretty()</code></td>
<td style="text-align:left"><code>where by = '菜鸟教程'</code></td>
</tr>
<tr>
<td style="text-align:left">小于</td>
<td style="text-align:left"><code>{&lt;key&gt;:{$lt:&lt;value&gt;}}</code></td>
<td style="text-align:left"><code>db.col.find({&quot;likes&quot;:{$lt:50}}).pretty()</code></td>
<td style="text-align:left"><code>where likes &lt; 50</code></td>
</tr>
<tr>
<td style="text-align:left">小于或等于</td>
<td style="text-align:left"><code>{&lt;key&gt;:{$lte:&lt;value&gt;}}</code></td>
<td style="text-align:left"><code>db.col.find({&quot;likes&quot;:{$lte:50}}).pretty()</code></td>
<td style="text-align:left"><code>where likes &lt;= 50</code></td>
</tr>
<tr>
<td style="text-align:left">大于</td>
<td style="text-align:left"><code>{&lt;key&gt;:{$gt:&lt;value&gt;}}</code></td>
<td style="text-align:left"><code>db.col.find({&quot;likes&quot;:{$gt:50}}).pretty()</code></td>
<td style="text-align:left"><code>where likes &gt; 50</code></td>
</tr>
<tr>
<td style="text-align:left">大于或等于</td>
<td style="text-align:left"><code>{&lt;key&gt;:{$gte:&lt;value&gt;}}</code></td>
<td style="text-align:left"><code>db.col.find({&quot;likes&quot;:{$gte:50}}).pretty()</code></td>
<td style="text-align:left"><code>where likes &gt;= 50</code></td>
</tr>
<tr>
<td style="text-align:left">不等于</td>
<td style="text-align:left"><code>{&lt;key&gt;:{$ne:&lt;value&gt;}}</code></td>
<td style="text-align:left"><code>db.col.find({&quot;likes&quot;:{$ne:50}}).pretty()</code></td>
<td style="text-align:left"><code>where likes != 50</code></td>
</tr>
</tbody>
</table>
</li>
</ul>
<h2 id="mongodb-and-条件">MongoDB AND 条件</h2>
<p>MongoDB 的 find() 方法可以传入多个键(key)，每个键(key)以逗号隔开，即常规 SQL 的 AND 条件。</p>
<p>语法格式如下：</p>
<pre><code class="language-bash"><div>db.col.find({key1:value1, key2:value2}).pretty()
</div></code></pre>
<h2 id="mongodb-or-条件">MongoDB OR 条件</h2>
<p>MongoDB OR 条件语句使用了关键字 <strong>$or</strong>,语法格式如下：</p>
<pre><code class="language-bash"><div>db.col.find(
   {
      <span class="hljs-variable">$or</span>: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()
</div></code></pre>
<h2 id="and-和-or-联合使用">AND 和 OR 联合使用</h2>
<p>以下实例演示了 AND 和 OR 联合使用，类似常规 SQL 语句为： <strong>'where likes&gt;50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'</strong></p>
<pre><code class="language-bash"><div>&gt;db.col.find({<span class="hljs-string">"likes"</span>: {<span class="hljs-variable">$gt</span>:50}, <span class="hljs-variable">$or</span>: [{<span class="hljs-string">"by"</span>: <span class="hljs-string">"菜鸟教程"</span>},{<span class="hljs-string">"title"</span>: <span class="hljs-string">"MongoDB 教程"</span>}]}).<span class="hljs-function"><span class="hljs-title">pretty</span></span>()
{
        <span class="hljs-string">"_id"</span> : ObjectId(<span class="hljs-string">"56063f17ade2f21f36b03133"</span>),
        <span class="hljs-string">"title"</span> : <span class="hljs-string">"MongoDB 教程"</span>,
        <span class="hljs-string">"description"</span> : <span class="hljs-string">"MongoDB 是一个 Nosql 数据库"</span>,
        <span class="hljs-string">"by"</span> : <span class="hljs-string">"菜鸟教程"</span>,
        <span class="hljs-string">"url"</span> : <span class="hljs-string">"http://www.runoob.com"</span>,
        <span class="hljs-string">"tags"</span> : [
                <span class="hljs-string">"mongodb"</span>,
                <span class="hljs-string">"database"</span>,
                <span class="hljs-string">"NoSQL"</span>
        ],
        <span class="hljs-string">"likes"</span> : 100
}
</div></code></pre>
<p>$type操作符是基于BSON类型来检索集合中匹配的数据类型，并返回结果。</p>
<p>MongoDB 中可以使用的类型如下表所示：</p>
<table>
<thead>
<tr>
<th style="text-align:left"><strong>类型</strong></th>
<th style="text-align:left"><strong>数字</strong></th>
<th style="text-align:left"><strong>备注</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Double</td>
<td style="text-align:left">1</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">String</td>
<td style="text-align:left">2</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Object</td>
<td style="text-align:left">3</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Array</td>
<td style="text-align:left">4</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Binary data</td>
<td style="text-align:left">5</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Undefined</td>
<td style="text-align:left">6</td>
<td style="text-align:left">已废弃。</td>
</tr>
<tr>
<td style="text-align:left">Object id</td>
<td style="text-align:left">7</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Boolean</td>
<td style="text-align:left">8</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Date</td>
<td style="text-align:left">9</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Null</td>
<td style="text-align:left">10</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Regular Expression</td>
<td style="text-align:left">11</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">JavaScript</td>
<td style="text-align:left">13</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Symbol</td>
<td style="text-align:left">14</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">JavaScript (with scope)</td>
<td style="text-align:left">15</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">32-bit integer</td>
<td style="text-align:left">16</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Timestamp</td>
<td style="text-align:left">17</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">64-bit integer</td>
<td style="text-align:left">18</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Min key</td>
<td style="text-align:left">255</td>
<td style="text-align:left">Query with <code>-1</code>.</td>
</tr>
<tr>
<td style="text-align:left">Max key</td>
<td style="text-align:left">127</td>
<td style="text-align:left"></td>
</tr>
</tbody>
</table>
<pre><code><code><div>db.collections.find({&quot;title&quot; : {$type : 'string'}})
db.collections.find({&quot;title&quot; : {$type : 2}})
</div></code></code></pre>
<h2 id="mongodb-limit-方法">MongoDB Limit() 方法</h2>
<p>如果你需要在MongoDB中读取指定数量的数据记录，可以使用MongoDB的Limit方法，limit()方法接受一个数字参数，该参数指定从MongoDB中读取的记录条数。</p>
<h3 id="语法">语法</h3>
<p>limit()方法基本语法如下所示：</p>
<pre><code class="language-bash"><div>&gt;db.COLLECTION_NAME.find().<span class="hljs-built_in">limit</span>(NUMBER)
</div></code></pre>
<h2 id="mongodb-skip-方法">MongoDB Skip() 方法</h2>
<p>我们除了可以使用limit()方法来读取指定数量的数据外，还可以使用skip()方法来跳过指定数量的数据，skip方法同样接受一个数字参数作为跳过的记录条数。</p>
<h3 id="语法-1">语法</h3>
<p>skip() 方法脚本语法格式如下：</p>
<pre><code class="language-bash"><div>&gt;db.COLLECTION_NAME.find().<span class="hljs-built_in">limit</span>(NUMBER).skip(NUMBER)
</div></code></pre>
<h2 id="mongodb-sort-方法">MongoDB sort() 方法</h2>
<p>在 MongoDB 中使用 sort() 方法对数据进行排序，sort() 方法可以通过参数指定排序的字段，并使用 1 和 -1 来指定排序的方式，其中 1 为升序排列，而 -1 是用于降序排列。</p>
<h3 id="语法-2">语法</h3>
<p>sort()方法基本语法如下所示：</p>
<pre><code class="language-bash"><div>&gt;db.COLLECTION_NAME.find().sort({KEY:1})

</div></code></pre>
<pre><code class="language-bash"><div>db.col.find({},{<span class="hljs-string">"title"</span>:1,_id:0}).sort({<span class="hljs-string">"likes"</span>:-1})
</div></code></pre>
<h1 id="mongodb-索引">MongoDB 索引</h1>
<p>索引通常能够极大的提高查询的效率，如果没有索引，MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。</p>
<p>这种扫描全集合的查询效率是非常低的，特别在处理大量的数据时，查询可以要花费几十秒甚至几分钟，这对网站的性能是非常致命的。</p>
<p><strong>索引是特殊的数据结构，索引存储在一个易于遍历读取的数据集合中，索引是对数据库表中一列或多列的值进行排序的一种结构</strong></p>
<h2 id="createindex-方法">createIndex() 方法</h2>
<p>MongoDB使用 createIndex() 方法来创建索引。</p>
<blockquote>
<p>注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex()，之后的版本使用了 db.collection.createIndex() 方法，ensureIndex() 还能用，但只是 createIndex() 的别名。</p>
</blockquote>
<h3 id="语法-3">语法</h3>
<p>createIndex()方法基本语法格式如下所示：</p>
<pre><code><code><div>&gt;db.collection.createIndex(keys, options)
</div></code></code></pre>
<p>语法中 Key 值为你要创建的索引字段，1 为指定按升序创建索引，如果你想按降序来创建索引指定为 -1 即可。</p>
<h3 id="实例">实例</h3>
<pre><code><code><div>&gt;db.col.createIndex({&quot;title&quot;:1})
&gt;
</div></code></code></pre>
<p>createIndex() 方法中你也可以设置使用多个字段创建索引（关系型数据库中称作复合索引）。</p>
<pre><code><code><div>&gt;db.col.createIndex({&quot;title&quot;:1,&quot;description&quot;:-1})
&gt;
</div></code></code></pre>
<p>createIndex() 接收可选参数，可选参数列表如下：</p>
<table>
<thead>
<tr>
<th style="text-align:left">Parameter</th>
<th style="text-align:left">Type</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">background</td>
<td style="text-align:left">Boolean</td>
<td style="text-align:left">建索引过程会阻塞其它数据库操作，background可指定以后台方式创建索引，即增加 &quot;background&quot; 可选参数。 &quot;background&quot; 默认值为<strong>false</strong>。</td>
</tr>
<tr>
<td style="text-align:left">unique</td>
<td style="text-align:left">Boolean</td>
<td style="text-align:left">建立的索引是否唯一。指定为true创建唯一索引。默认值为<strong>false</strong>.</td>
</tr>
<tr>
<td style="text-align:left">name</td>
<td style="text-align:left">string</td>
<td style="text-align:left">索引的名称。如果未指定，MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。</td>
</tr>
<tr>
<td style="text-align:left">dropDups</td>
<td style="text-align:left">Boolean</td>
<td style="text-align:left">**3.0+版本已废弃。**在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 <strong>false</strong>.</td>
</tr>
<tr>
<td style="text-align:left">sparse</td>
<td style="text-align:left">Boolean</td>
<td style="text-align:left">对文档中不存在的字段数据不启用索引；这个参数需要特别注意，如果设置为true的话，在索引字段中不会查询出不包含对应字段的文档.。默认值为 <strong>false</strong>.</td>
</tr>
<tr>
<td style="text-align:left">expireAfterSeconds</td>
<td style="text-align:left">integer</td>
<td style="text-align:left">指定一个以秒为单位的数值，完成 TTL设定，设定集合的生存时间。</td>
</tr>
<tr>
<td style="text-align:left">v</td>
<td style="text-align:left">index version</td>
<td style="text-align:left">索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。</td>
</tr>
<tr>
<td style="text-align:left">weights</td>
<td style="text-align:left">document</td>
<td style="text-align:left">索引权重值，数值在 1 到 99,999 之间，表示该索引相对于其他索引字段的得分权重。</td>
</tr>
<tr>
<td style="text-align:left">default_language</td>
<td style="text-align:left">string</td>
<td style="text-align:left">对于文本索引，该参数决定了停用词及词干和词器的规则的列表。 默认为英语</td>
</tr>
<tr>
<td style="text-align:left">language_override</td>
<td style="text-align:left">string</td>
<td style="text-align:left">对于文本索引，该参数指定了包含在文档中的字段名，语言覆盖默认的language，默认值为 language.</td>
</tr>
</tbody>
</table>
<h3 id="实例-1">实例</h3>
<p>在后台创建索引：</p>
<pre><code><code><div>db.values.createIndex({open: 1, close: 1}, {background: true})
</div></code></code></pre>
<p>通过在创建索引时加 background:true 的选项，让创建工作在后台执行</p>

    </body>
    </html>